  
#include "DS3231_Init.h"
#include "exit.h"

unsigned char currentdate[6] = {0};                             //读取时间时所用暂存变量
unsigned char rtc_address[6] = {0x00,0x01,0x02,0x04,0x05,0x06}; //秒分时日月年 6位

//	unsigned char testdate[6] = {18,19,11,12,10,20};      
	unsigned char setdate[6] = {9,9,9,9,9,9};                 //测试用
	
unsigned char tempdate[6] = {0};                                //测试用

int Sec;                    //将秒转成ASCII码时的中间变量
int Minu;                   //将分转成ASCII码时的中间变量
int Hour;                   //将小时转成ASCII码时的中间变量
int Day;                    //将日成ASCII码时的中间变量
int Mon;                    //将月转成ASCII码时的中间变量
int Year;                   //将年转成ASCII码时的中间变量
int TxYear[4];                                 //发送的年
int TxDay[2];                                  //发送的日期
int TxHour[2];                                 //发送的小时
int TxMinu[2];                                 //发送的分钟
int TxSec[2];                                  //发送的秒
int t;


/*******************创建指针型数组（用于校准日期的上传）*********************************/


int SEC, MIN, HOR, DAY, MON, YER;               //设备设置时间时所用变量
int hourj, mintj;                               //小时和分钟进位
int hourtemp, minttemp, secdtemp;               //设置时间
int houralarm10, mintalarm10, secdalarm10;      //设置时间 时分秒的十位
int houralarm, mintalarm, secdalarm;            //设置时间 时分秒的个位
int secflag = 0;                                //秒中断标志

//程序测试时用的一些观察变量
unsigned char temp = 0;
unsigned char temp1 = 0;
int temp2 = 0, temp7 = 0, temp8 = 0, temp9 = 0, tempA = 0;




void DS3231_Init(void)
{

//	GPIO_SetBits(GPIOF,GPIO_Pin_0);
//	GPIO_SetBits(GPIOF,GPIO_Pin_1);
	I2C_single_byte_write(0x0e, 0x00); // 控制寄存器0eh，方波输出频率为1Hz(可改)
    delay_us(100);
    I2C_single_byte_write(0x0f, 0x00);
    delay_us(100);
	
		//P3OUT |= BIT1;                  // P3.1 = 1 释放I2C总线的数据线
	    //P3OUT |= BIT2;                  // P3.2 = 1 释放I2C总线的时钟线
		//	I2cByteWrite(0x0e,0x00);
		//	delay_us(20);
		//	Delay(0xFFFFF);
		//	I2cByteWrite(0x0f,0x00);
		//	Delay(0xFFFFF);
		//	delay_us(20);
}
/***********************************
 * 读取RTC当前时间
 * *********************************/
void Read_RTC(void)
{

	
    unsigned char i;
    for(i=0;i<6;i++)            // 分六次读取 秒分时日月年
    {
        currentdate[i] = I2C_single_byte_read(rtc_address[i]);
        //转换为10进制
        //currentdate[i] = ((currentdate[i]>>4)*10 + (currentdate[i]&0x0f));
    }
    Sec=currentdate[0];
    Minu=currentdate[1];
    Hour=currentdate[2];
    Day=currentdate[3];
    Mon=currentdate[4];
    Year=currentdate[5];
	
//	Sec=testdate[0];
//    Minu=testdate[1];
//    Hour=testdate[2];
//    Day=testdate[3];
//    Mon=testdate[4];
//    Year=testdate[5];
	

    TimeToAscII();  //将时间转换成ASCII码
	
}

/***********************************
 * 设置RTC当前时间和秒中断
 * *********************************/
void Set_RTC(void)
{
    unsigned char i;
    //unsigned char tmp;
    for(i=0;i<6;i++)            // 分六次写入 秒分时日月年
    {
        //对存储的数BCD处理
/*        tmp = setdate[i]/10;
        tmp <<= 4;
        tempdate[i] = setdate[i]%10;
        tempdate[i] = tempdate[i] + tmp;
*/
        I2C_single_byte_write(rtc_address[i], setdate[i]);
        delay_us(20);
    }

}
//秒中断设置
void SecondAlarm(void)
{
    I2C_single_byte_write(0x07, 0x80); //
    delay_us(1000);
    I2C_single_byte_write(0x08, 0x80); //
    delay_us(1000);
    I2C_single_byte_write(0x09, 0x80); //
    delay_us(1000);
    I2C_single_byte_write(0x0A, 0x80); //
    delay_us(1000);

    I2C_single_byte_write(0x0e, 0x05); // 控制寄存器0eh，方波输出频率为1.024kHz(可改)，使能触发INT闹钟，A1闹钟和A1中断
    delay_us(1000);
}


//设置下一次时间
void Set_NEXTRTC(int intervaltime)
{

    mintj = (SEC + intervaltime)/60;                // 分钟进位 sec为READRTC的当前时间
    secdtemp = (SEC + intervaltime)%60;             // 设置秒数
    hourj = (MIN + mintj)/60;                       // 小时进位
    minttemp = (MIN + mintj)%60;                    // 设置分数
    hourtemp = (HOR + hourj)%24;                    // 设置时数

    houralarm10 = hourtemp/10;                      // 设置时数的十位
    houralarm = hourtemp%10;                        // 设置时数的个位

    mintalarm10 = minttemp/10;                      // 设置分数的十位
    mintalarm = minttemp%10;                        // 设置分数的个位

    secdalarm10 = secdtemp/10;                      // 设置秒数的十位
    secdalarm = secdtemp%10;                        // 设置秒数的个位

    temp = (secdalarm10<<4)+secdalarm;
    I2C_single_byte_write(0x07, (secdalarm10<<4)+secdalarm); //将秒写入时钟芯片
    delay_us(1000);
    temp7 = I2C_single_byte_read(0x07);
    I2C_single_byte_write(0x08, (mintalarm10<<4)+mintalarm); //将分写入时钟芯片
    delay_us(1000);
    temp8 = I2C_single_byte_read(0x08);
    I2C_single_byte_write(0x09, (houralarm10<<4)+houralarm); //将时写入时钟芯片
    delay_us(1000);
    temp9 = I2C_single_byte_read(0x09);
    I2C_single_byte_write(0x0A, 0x80);
    delay_us(1000);
    tempA = I2C_single_byte_read(0x0A);

    //I2cByteWrite(0x0f, 0x00);
    //temp2 = I2cByteRead(0x0f);
    I2C_single_byte_write(0x0e, 0x05); // 控制寄存器0eh，方波输出频率为1.024kHz(可改)，使能触发INT闹钟，A1闹钟和A1中断
    delay_us(1000);
}


/***********************************
 * 将时间变成ASCII码
 * *********************************/
void TimeToAscII(void)
{
    TxYear[0] = 0x32;                       // 2
    TxYear[1] = 0x30;                       //0
    TxYear[2] = ((Year&0x00F0)>>4)+0x0030;  //年的后两位转换成ASCII码
    TxYear[3] = ((Year)&0x000F)+0x30;       //年的后两位转换成ASCII码
	


    TxDay[0] = ((Day&0xF0)>>4)+0x30;        //日转换成ASCII码
    TxDay[1] = ((Day)&0x000F)+0x30;         //日转换成ASCII码

    TxHour[0] = ((Hour&0xF0)>>4)+0x30;      //时转换成ASCII码
    TxHour[1] = ((Hour)&0x000F)+0x30;       //时转换成ASCII码

    TxMinu[0] = ((Minu&0xF0)>>4)+0x30;      //分转换成ASCII码
    TxMinu[1] = ((Minu)&0x000F)+0x30;       //分转换成ASCII码

    TxSec[0] = ((Sec&0xF0)>>4)+0x30;        //秒转换成ASCII码
    TxSec[1] = ((Sec)&0x000F)+0x30;         //秒转换成ASCII码
}

/***********************************
 * 将时间变成十进制
 * *********************************/
void TimeToDec(void)
{
    SEC = ((Sec & 0xF0)>>4)*10 + (Sec & 0x000F);
    MIN = ((Minu & 0xF0)>>4)*10 + (Minu & 0x000F);
    HOR = ((Hour & 0xF0)>>4)*10 + (Hour & 0x000F);
    // DAY = ((Day & 0xF0)>>4)*10 + (Day & 0x000F);     // 不需要年月日匹配
    // MON = ((Mon & 0xF0)>>4)*10 + (Mon & 0x000F);     //
    // YER = ((Year & 0xF0)>>4)*10 + (Year & 0x000F);   //
}



